package rescuecore2.standard.entities;

import rescuecore2.worldmodel.Entity;
import rescuecore2.worldmodel.EntityID;
import rescuecore2.worldmodel.Property;
import rescuecore2.worldmodel.properties.IntProperty;

/**
 * The World object.
 */
public class World extends StandardEntity {

  private IntProperty startTime;
  private IntProperty longitude;
  private IntProperty latitude;
  private IntProperty windForce;
  private IntProperty windDirection;


  /**
   * Construct a World object with entirely undefined property values.
   *
   * @param id
   *          The ID of this entity.
   */
  public World( EntityID id ) {
    super( id );
    startTime = new IntProperty( StandardPropertyURN.START_TIME );
    longitude = new IntProperty( StandardPropertyURN.LONGITUDE );
    latitude = new IntProperty( StandardPropertyURN.LATITUDE );
    windForce = new IntProperty( StandardPropertyURN.WIND_FORCE );
    windDirection = new IntProperty( StandardPropertyURN.WIND_DIRECTION );
    registerProperties( startTime, longitude, latitude, windForce,
        windDirection );
  }


  /**
   * World copy constructor.
   *
   * @param other
   *          The World to copy.
   */
  public World( World other ) {
    super( other );
    startTime = new IntProperty( other.startTime );
    longitude = new IntProperty( other.longitude );
    latitude = new IntProperty( other.latitude );
    windForce = new IntProperty( other.windForce );
    windDirection = new IntProperty( other.windDirection );
    registerProperties( startTime, longitude, latitude, windForce,
        windDirection );
  }


  @Override
  protected Entity copyImpl() {
    return new World( getID() );
  }


  @Override
  public StandardEntityURN getStandardURN() {
    return StandardEntityURN.WORLD;
  }


  @Override
  public Property getProperty( String urn ) {
    StandardPropertyURN type;
    try {
      type = StandardPropertyURN.fromString( urn );
    } catch ( IllegalArgumentException e ) {
      return super.getProperty( urn );
    }
    switch ( type ) {
      case START_TIME:
        return startTime;
      case LONGITUDE:
        return longitude;
      case LATITUDE:
        return latitude;
      case WIND_FORCE:
        return windForce;
      case WIND_DIRECTION:
        return windDirection;
      default:
        return super.getProperty( urn );
    }
  }


  /**
   * Get the startTime property.
   *
   * @return The startTime property.
   */
  public IntProperty getStartTimeProperty() {
    return startTime;
  }


  /**
   * Get the value of the startTime property.
   *
   * @return The value of the startTime property.
   */
  public int getStartTime() {
    return startTime.getValue();
  }


  /**
   * Set the startTime property.
   *
   * @param startTime
   *          The new startTime.
   */
  public void setStartTime( int startTime ) {
    this.startTime.setValue( startTime );
  }


  /**
   * Find out if the startTime property has been defined.
   *
   * @return True if the startTime property has been defined, false otherwise.
   */
  public boolean isStartTimeDefined() {
    return startTime.isDefined();
  }


  /**
   * Undefine the startTime property.
   */
  public void undefineStartTime() {
    startTime.undefine();
  }


  /**
   * Get the latitude property.
   *
   * @return The latitude property.
   */
  public IntProperty getLatitudeProperty() {
    return latitude;
  }


  /**
   * Get the value of the latitude property.
   *
   * @return The value of the latitude property.
   */
  public int getLatitude() {
    return latitude.getValue();
  }


  /**
   * Set the latitude property.
   *
   * @param latitude
   *          The new latitude.
   */
  public void setLatitude( int latitude ) {
    this.latitude.setValue( latitude );
  }


  /**
   * Find out if the latitude property has been defined.
   *
   * @return True if the latitude property has been defined, false otherwise.
   */
  public boolean isLatitudeDefined() {
    return latitude.isDefined();
  }


  /**
   * Undefine the latitude property.
   */
  public void undefineLatitude() {
    latitude.undefine();
  }


  /**
   * Get the longitude property.
   *
   * @return The longitude property.
   */
  public IntProperty getLongitudeProperty() {
    return longitude;
  }


  /**
   * Get the value of the longitude property.
   *
   * @return The value of the longitude property.
   */
  public int getLongitude() {
    return longitude.getValue();
  }


  /**
   * Set the longitude property.
   *
   * @param longitude
   *          The new longitude.
   */
  public void setLongitude( int longitude ) {
    this.longitude.setValue( longitude );
  }


  /**
   * Find out if the longitude property has been defined.
   *
   * @return True if the longitude property has been defined, false otherwise.
   */
  public boolean isLongitudeDefined() {
    return longitude.isDefined();
  }


  /**
   * Undefine the longitude property.
   */
  public void undefineLongitude() {
    longitude.undefine();
  }


  /**
   * Get the windForce property.
   *
   * @return The windForce property.
   */
  public IntProperty getWindForceProperty() {
    return windForce;
  }


  /**
   * Get the value of the windForce property.
   *
   * @return The value of the windForce property.
   */
  public int getWindForce() {
    return windForce.getValue();
  }


  /**
   * Set the windForce property.
   *
   * @param windForce
   *          The new windForce.
   */
  public void setWindForce( int windForce ) {
    this.windForce.setValue( windForce );
  }


  /**
   * Find out if the windForce property has been defined.
   *
   * @return True if the windForce property has been defined, false otherwise.
   */
  public boolean isWindForceDefined() {
    return windForce.isDefined();
  }


  /**
   * Undefine the windForce property.
   */
  public void undefineWindForce() {
    windForce.undefine();
  }


  /**
   * Get the windDirection property.
   *
   * @return The windDirection property.
   */
  public IntProperty getWindDirectionProperty() {
    return windDirection;
  }


  /**
   * Get the value of the windDirection property.
   *
   * @return The value of the windDirection property.
   */
  public int getWindDirection() {
    return windDirection.getValue();
  }


  /**
   * Set the windDirection property.
   *
   * @param windDirection
   *          The new windDirection.
   */
  public void setWindDirection( int windDirection ) {
    this.windDirection.setValue( windDirection );
  }


  /**
   * Find out if the windDirection property has been defined.
   *
   * @return True if the windDirection property has been defined, false
   *         otherwise.
   */
  public boolean isWindDirectionDefined() {
    return windDirection.isDefined();
  }


  /**
   * Undefine the windDirection property.
   */
  public void undefineWindDirection() {
    windDirection.undefine();
  }
}
